// 包service处理业务逻辑（隔离数据操作与业务规则）
package service

import (
	"errors"
	"fmt"
	"gitee.com/ysl729895/go-mall/internal/model"
	"gitee.com/ysl729895/go-mall/internal/repository"
	"gorm.io/gorm"
)

// ProductService 定义商品业务接口
type ProductService interface {
	CreateProduct(product *model.Product) error
	GetProduct(id uint) (*model.Product, error)
}

// productService 实现ProductService接口
type productService struct {
	repo repository.ProductRepository // 依赖Repository接口
}

// NewProductService 构造函数（依赖注入repo）
func NewProductService(repo repository.ProductRepository) ProductService {
	return &productService{repo: repo}
}

// CreateProduct 创建商品（添加业务逻辑验证）
func (s *productService) CreateProduct(product *model.Product) error {
	return s.repo.GetDB().Transaction(func(tx *gorm.DB) error {
		// 校验1：价格
		if product.Price <= 0 {
			return errors.New("价格必须大于0")
		}

		// 校验2：分类存在
		var category model.Category
		if err := tx.First(&category, product.CategoryID).Error; err != nil {
			return fmt.Errorf("分类ID %d 不存在", product.CategoryID)
		}
		product.Category = &category

		// 执行创建
		return tx.Create(product).Error
	})
}

// GetProduct 查询商品
func (s *productService) GetProduct(id uint) (*model.Product, error) {
	return s.repo.GetByID(id)
}
